CreatedDate, CreatedBy 어노테이션

JPA에는 엔티티의 생성 정보를 자동으로 기록해주는 @CreatedDate@CreatedBy와 같은 어노테이션이 있다. @CreatedDate 어노테이션은 엔티티가 생성된 날짜와 시간을 자동으로 저장하는 데 사용되며, @CreatedBy 어노테이션은 엔티티를 생성한 사용자의 정보를 기록하는 데 사용된다. 이 두 어노테이션의 사용 방법과 그 역할에 대해 알아보자.

예시 코드

@MappedSuperclass
@Getter @Setter @ToString
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedDate
    @Column(insertable = false)
    private LocalDateTime updatedAt;

    @LastModifiedBy
    @Column(insertable = false)
    private String updatedBy;

}

위 코드는 JPA에서 자식 클래스들에 모두 적용할 컬럼을 지정하는 슈퍼 클래스의 예시이다.

모든 자식 클래스들에 생성일, 생성자, 최종수정일, 최종수정자를 컬럼으로 갖게 하여 DB와 매핑시킬 의도를 가지고 있다.

사전작업

1. AuditorAware 구현체 정의

@Component("auditAwareImpl")
public class AuditAwareImpl implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        return Optional.of("AUDITOR");
    }
}

AuditorAware를 구현한 클래스인 AuditAwareImpl을 작성한다.
AuditAwareImpl에는 @Component로써 auditAwareImpl이름을 붙여두고(추후 메인 클래스에서 지정하기 위함), getCurrentAuditor()메서드에서는 감사자(auditor)로 들어갈 값을 지정해주면 된다. 예시 코드의 경우, @CreatedBy가 지정된 컬럼에는 “AUDITOR”가 들어갈 것이다.

2. 엔티티 리스너 지정

예시코드에서 보았듯, BaseEntity에 @EntityListeners(AuditingEntityListener.class)어노테이션을 추가해준다.
이를 통해 해당 어노테이션에서 Auditing 기능이 제대로 동작하여 원하는 컬럼에 값을 자동으로 지정해줄 것이다.

3. 메인 클래스에 @EnableJpaAuditing 활성화

@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditAwareImpl")
public class AccountsApplication {

	public static void main(String[] args) {
		SpringApplication.run(AccountsApplication.class, args);
	}

}

Auditing 기능을 사용하기 위해서는 메인 클래스에서 @EnableJpaAuditing 어노테이션이 필요하다. auditorAwareRef에는 아까 작성한 auditAwareImpl를 넣어준다. 이를 통해 감사자 정보를 엔티티에 전달해줄 수 있게 된다.

💡Auditor를 전달하기 위해서는 위 1,2,3 과정이 전부 필요하며, 시간을 전달하기 위함이라면 2 과정만 해도 상관 없다.
@CreatedDate@CreatedBy는 다르게 동작하기 때문이다.
@CreatedDate: DateTimeProvider를 통해 날짜와 시간을 설정하며, DateTimeProvider는 사용자 정의가 가능하다.
@CreatedBy: AuditorAware 인터페이스를 통해 현재 감사자를 설정하며, AuditorAware 구현체를 통해 이 또한 사용자 정의할 수 있다.

@LastModifiedDate, @LastModifiedBy

@LastModifiedDate@LastModifiedBy도 동일하게 동작한다.